òɾۿûѧϰʹá
ԭַhttps://www.joinquant.com/post/14326

ԭһ˵ʽ鵽ԭĺ߽ۡ


ԭĲԴ£

# 뺯
from jqdata import *

# ʼ趨׼ȵ
def initialize(context):
    # 趨׼
    set_benchmark('000300.XSHG')
    # ̬Ȩģʽ(ʵ۸)
    set_option('use_real_price', True)
    # ݵ־ log.info()
    log.info('ʼʼȫֻһ')
    # ˵orderϵAPIıerror͵log
    # log.set_level('order', 'error') 
    
    ### ȯ趨 ###
    # ˻: ȯ˻
    set_subportfolios([SubPortfolioConfig(cash=context.portfolio.cash, type='stock_margin')])
    
    ## 趨
    # 趨: 껯8%, Ĭ8%
    set_option('margincash_interest_rate', 0.08)
    # ʱ֤: 150%, Ĭ100%
    set_option('margincash_margin_rate', 1.5)
    
    ## ȯ趨
    # 趨ȯ: 껯10%, Ĭ10%
    set_option('marginsec_interest_rate', 0.10)
    # 趨ȯ֤: 150%, Ĭ100%
    set_option('marginsec_margin_rate', 1.5)
    
    ## кreference_securityΪʱĲοģıֻ֣˴'000300.XSHG''510300.XSHG'һģ
      # ǰ
    run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') 
      # ʱ
    # run_daily(market_open, time='open', reference_security='000300.XSHG')
      # ̺
    run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')


## ǰк     
def before_market_open(context):
    # ʱ
    log.info('ʱ(before_market_open)'+str(context.current_dt.time()))

    # ΢ŷϢģ⽻ף΢Ч
    send_message('õһ~')

    # ҪĹƱg.Ϊȫֱ
    # ĹƱ루йУ
    g.rz_stock = '601988.XSHG'
    # ȯĹƱ루ƽУ
    g.rq_stock = '002048.XSHE'
    
    g.p_mean = 2.8539
    g.p_std = 0.00149
    g.beta = 0.0567

## ʱк
def handle_data(context, data):
    # ȷʱܼ
    weekday = context.current_dt.isoweekday()
    log.info(" %s" % weekday)
    # ĹƱ루йУ
    rz_stock = g.rz_stock
    # ȯĹƱ루ƽУ
    rq_stock = g.rq_stock
    data1 = attribute_history(rz_stock, 1, '1d', ['close'])['close'][0]
    data2 = attribute_history(rq_stock, 1, '1d', ['close'])['close'][0]
    portf = data1 - g.beta*data2
    ava_margin = context.portfolio.subportfolios[0].available_margin
    print(ava_margin)
    print(portf,g.p_mean * (1+2*g.p_std))
    short_closeable_rz = context.portfolio.short_positions[g.rz_stock].closeable_amount
    short_closeable_rq = context.portfolio.short_positions[g.rq_stock].closeable_amount
    long_closeable_rz = context.portfolio.long_positions[g.rz_stock].closeable_amount
    long_closeable_rq = context.portfolio.long_positions[g.rq_stock].closeable_amount
    # if portf > g.p_mean * (1+2*g.p_std) and portf < g.p_mean * (1+5*g.p_std):
    #     # margincash_close(rz_stock, long_closeable_rz*0.5)
    #     order(rz_stock, long_closeable_rz,side='short')
    #     marginsec_close(rq_stock, short_closeable_rq)
    if portf > g.p_mean * (1+2*g.p_std):
        order(rz_stock, -long_closeable_rz,side='long')
        marginsec_close(rq_stock, short_closeable_rq)
    if portf < g.p_mean * (1-2*g.p_std) and ava_margin>0:
        order(rz_stock, 50000,side='long')
        marginsec_open(rq_stock, 50000*g.beta)
    # if portf > g.p_mean * (1+10*g.p_std):
    #     order(rq_stock, 30000*g.beta,side='long')
    #     marginsec_open(rz_stock, 30000)
    # if portf < g.p_mean * (1+2*g.p_std) and ava_margin > 0:
    #     order(rq_stock, -long_closeable_rq,side='long')
    #     marginsec_close(rz_stock, short_closeable_rz)
        
    # ж
    # if weekday in (1, 2):
    #     # ʲ
    #     log.info("10000й")
    #     margincash_open(rz_stock, 10000)

    #     # ȯ
    #     log.info("ȯ10000ƽ")
    #     marginsec_open(rq_stock, 10000)
        
    # elif weekday == 3:
    #     # ʲ
    #     log.info("ȯ10000й")
    #     margincash_close(rz_stock, 10000)

    #     # ȯ
    #     log.info("ȯȯ10000ƽ")
    #     marginsec_close(rq_stock, 10000)
        
    # elif weekday == 4:
    #     # ʲ
    #     log.info("ֱӻǮ10000Ԫ")
    #     margincash_direct_refund(10000)

    #     # ȯ
    #     log.info("10000ƽ, Ȼֱӻȯ10000ƽ")
    #     order(rq_stock, 10000, side='long')
    #     marginsec_direct_refund(rq_stock, 10000) 

## ̺к  
def after_market_close(context):
    # 鿴ȯ˻Ϣ(API--SubPortfolio)
    p = context.portfolio.subportfolios[0]
    log.info('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -')
    log.info('鿴ȯ˻Ϣ(API--SubPortfolio)')
    log.info('ʲ',p.total_value)
    log.info('ʲ',p.net_value)
    log.info('ܸծ',p.total_liability)
    log.info('ʸծ',p.cash_liability)
    log.info('ȯծ',p.sec_liability)
    log.info('Ϣܸծ',p.interest)
    log.info('ñ֤',p.available_margin)
    log.info('άֵ',p.maintenance_margin_rate)
    log.info('˻ͣ',p.type)
    log.info('##############################################################')


    
    
    
